﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Fuyao.Business.Entities.Models;
using Fuyao.Business.Logic.BC;

namespace Fuyao.Win.UI.Seguridad
{
    public partial class frmPerfiles : Form
    {
        BusinessLogic bc = new BusinessLogic();
        List<Perfil> listPerfil = new List<Perfil>();
        bool treeViewHasChanged = false;
        DataGridViewRow currentRow; 

        public frmPerfiles()
        {
            InitializeComponent();
        }

        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
            this.ControlBox = false;
            this.WindowState = FormWindowState.Maximized;
            this.BringToFront();
            cargarGrillaPerfiles();
        }

        private void cargarGrillaPerfiles()
        {
            listPerfil = bc.getPerfil();
            dgvPerfiles.BackgroundColor = Color.WhiteSmoke;
            dgvPerfiles.AutoGenerateColumns = false;
            dgvPerfiles.AllowUserToAddRows = false;
            colNombrePerfil.DataPropertyName = "DescripcionPerfil";
            colNombrePerfil.MaxInputLength = 50;
            dgvPerfiles.DataSource = listPerfil;
        }

        private void grabarMenu(int perfilID)
        {
            if (dgvPerfiles.CurrentRow != null && dgvPerfiles.CurrentRow.DataBoundItem != null)
            {
                Perfil oPerfilSeleccionado = (Perfil)dgvPerfiles.CurrentRow.DataBoundItem;
                List<MenuXPerfil> listMenuXPerfil = new List<MenuXPerfil>();
                MenuXPerfil oMenuXPerfil = new MenuXPerfil();

                foreach (TreeNode node in tvwMenu.Nodes)
                {
                    if (node.Checked)
                    {
                        oMenuXPerfil = new MenuXPerfil();
                        oMenuXPerfil.MenuID = Convert.ToInt32(node.Tag);
                        oMenuXPerfil.PerfilID = perfilID;
                        listMenuXPerfil.Add(oMenuXPerfil);
                    }

                    foreach (TreeNode nodeChild in node.Nodes)
                    {
                        if (nodeChild.Checked)
                        {
                            oMenuXPerfil = new MenuXPerfil();
                            oMenuXPerfil.MenuID = Convert.ToInt32(nodeChild.Tag);
                            oMenuXPerfil.PerfilID = perfilID;
                            listMenuXPerfil.Add(oMenuXPerfil);
                        }
                    }
                }

                if (bc.InsertarActualizarPerfil_MenuXPerfil(oPerfilSeleccionado, listMenuXPerfil))
                {
                    if (oPerfilSeleccionado.PerfilID == 0) MessageBox.Show("Se actualizaron los accesos del nuevo perfil ingresado", "Sistema FUYAO - Mensaje de Confirmación", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    else MessageBox.Show("Se actualizaron los accesos del perfil seleccionado", "Sistema FUYAO - Mensaje de Confirmación", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    cargarGrillaPerfiles();
                }
            }
            else MessageBox.Show("Seleccione un perfil", "Sistema FUYAO - Validando Opción", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        private void cargarMenu(int? perfilID)
        {
            List<Fuyao.Business.Entities.Models.Menu> listMenu = bc.getMenuWithChildByPerfilID(perfilID);

            tvwMenu.BeginUpdate();
            tvwMenu.Nodes.Clear();
            tvwMenu.ImageList = imgList;

            TreeNode _NewTreeNode = default(TreeNode);

            //Menu
            foreach (Fuyao.Business.Entities.Models.Menu oMenu in listMenu)
            {
                _NewTreeNode = new TreeNode(oMenu.NombreMenu);
                _NewTreeNode.Tag = oMenu.MenuID;
                _NewTreeNode.Checked = oMenu.TieneAcceso;
                // _NewTreeNode.NodeFont = new Font("Arial", 9);
                _NewTreeNode.ImageIndex = 0;
                _NewTreeNode.EnsureVisible();
                tvwMenu.Nodes.Add(_NewTreeNode);

                //SubMenu
                if (oMenu.SubMenuList != null)
                {
                    foreach (SubMenu oSubMenu in oMenu.SubMenuList)
                    {
                        _NewTreeNode = new TreeNode(oSubMenu.NombreSubMenu);
                        _NewTreeNode.Tag = oSubMenu.MenuID;
                        _NewTreeNode.Checked = oSubMenu.TieneAcceso;
                        _NewTreeNode.ImageIndex = 1;
                        tvwMenu.Nodes[listMenu.IndexOf(oMenu)].Nodes.Add(_NewTreeNode);
                    }
                }
            }
            tvwMenu.EndUpdate();
            tvwMenu.CollapseAll();
        }

        private void btnNuevoPerfil_Click(object sender, EventArgs e)
        {
            Perfil oNewPerfil = new Perfil();
            listPerfil.Add(oNewPerfil);
            dgvPerfiles.DataSource = null;
            dgvPerfiles.DataSource = listPerfil;
            cargarMenu(oNewPerfil.PerfilID);
        }

        private void dgvPerfiles_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex != -1 && dgvPerfiles.CurrentRow != null)
            {
                Perfil oPerfilRow = (Perfil)dgvPerfiles.CurrentRow.DataBoundItem;
                cargarMenu(oPerfilRow.PerfilID);
            }
        }

        private void btnEliminar_Click(object sender, EventArgs e)
        {

        }

        private void btnGrabarPerfil_Click(object sender, EventArgs e)
        {
            if (dgvPerfiles.CurrentRow != null)
            {
                Perfil oPerfilRow = (Perfil)dgvPerfiles.CurrentRow.DataBoundItem;
                grabarMenu(oPerfilRow.PerfilID);
            }
        }

        private void btnCerrar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btnMaximizar_Click(object sender, EventArgs e)
        {
            this.WindowState = FormWindowState.Maximized;
        }

        private void btnRestaurar_Click(object sender, EventArgs e)
        {
            this.WindowState = FormWindowState.Normal;
        }

        private void tvwMenu_AfterCheck(object sender, TreeViewEventArgs e)
        {
            treeViewHasChanged = true;
            tvwMenu.BeginUpdate();
            ActualizarCheck(e.Node, e.Node.Checked);
            tvwMenu.EndUpdate();
        }

        private void ActualizarCheck(TreeNode node, bool check)
        {
            foreach (TreeNode n in node.Nodes)
            {
                n.Checked = check;
                if (n.Nodes.Count != 0) ActualizarCheck(n, check);
            }
        }

    }
}
